package com.edu.exam.enums.examination.security;

/**
 * 认证状态枚举
 *
 * 从SessionSecurity.AuthStatus迁移而来
 * 定义考试会话的认证状态，用于跟踪用户认证流程的各个阶段
 *
 * @author System
 * @version 1.0.0
 */
public enum AuthenticationStatus {

    /**
     * 未开始 - 认证流程尚未开始
     */
    NOT_STARTED("NOT_STARTED", "未开始"),

    /**
     * 未认证 - 用户尚未开始认证流程
     */
    NOT_AUTHENTICATED("NOT_AUTHENTICATED", "未认证"),

    /**
     * 认证中 - 用户正在认证过程中
     */
    AUTHENTICATING("AUTHENTICATING", "认证中"),

    /**
     * 已认证 - 用户已成功完成认证
     */
    AUTHENTICATED("AUTHENTICATED", "已认证"),

    /**
     * 认证失败 - 用户认证失败
     */
    AUTHENTICATION_FAILED("AUTHENTICATION_FAILED", "认证失败"),

    /**
     * 认证过期 - 用户认证已过期
     */
    AUTHENTICATION_EXPIRED("AUTHENTICATION_EXPIRED", "认证过期"),

    /**
     * 认证撤销 - 用户认证被撤销
     */
    AUTHENTICATION_REVOKED("AUTHENTICATION_REVOKED", "认证撤销"),

    /**
     * 认证锁定 - 用户认证被锁定
     */
    AUTHENTICATION_LOCKED("AUTHENTICATION_LOCKED", "认证锁定"),

    /**
     * 多因素认证中 - 用户正在进行多因素认证
     */
    MULTI_FACTOR_AUTHENTICATING("MULTI_FACTOR_AUTHENTICATING", "多因素认证中"),

    /**
     * 多因素认证失败 - 多因素认证失败
     */
    MULTI_FACTOR_FAILED("MULTI_FACTOR_FAILED", "多因素认证失败"),

    /**
     * 会话过期 - 会话已过期，需要重新认证
     */
    SESSION_EXPIRED("SESSION_EXPIRED", "会话过期"),

    /**
     * 强制注销 - 用户被强制注销
     */
    FORCE_LOGOUT("FORCE_LOGOUT", "强制注销");

    private final String code;
    private final String description;

    AuthenticationStatus(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根据编码获取对应的枚举
     *
     * @param code 编码
     * @return 对应的枚举
     */
    public static AuthenticationStatus fromCode(String code) {
        for (AuthenticationStatus status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Unknown authentication status code: " + code);
    }

    /**
     * 根据描述获取对应的枚举
     *
     * @param description 描述
     * @return 对应的枚举
     */
    @Override
    public String toString() {
        return description;
    }
}
